package com.awspaas.user.apps.cpq.util;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.actionsoft.bpms.commons.database.RowMap;
import com.actionsoft.bpms.util.DBSql;
import com.actionsoft.exception.BPMNError;
import com.alibaba.fastjson.JSONObject;

public class RefreshDataUtils {

	/**
	 * 物料价格更新后，对制造件和采购件直接关联的装配件进行更新
	 * @param aboutCPMap
	 * @param zpjMap
	 * @param userMap
	 * @param zpjsql
	 * @param zjsql
	 * @return
	 */
	public static Map<String, JSONObject> getZPTMaterials( Map<String , List<RowMap>>aboutCPMap,Map<String, JSONObject> zpjMap,Map<String, JSONObject> userMap,String zpjsql,String zjsql) {
		
		List<String> sqlList=new ArrayList<>();
		

		for (String key : aboutCPMap.keySet()) {
			 List<RowMap> lists=aboutCPMap.get(key);
			 RowMap data=lists.get(0);
			 String dj=data.getString("JG");//单价			 
			 String BH=data.getString("BH");//物料编号
			 //物料编号不包含勾选的装配件编号数据。
				 BigDecimal djnum=new BigDecimal(dj);				 
				 String clf=data.getString("WCLF").isEmpty()?"0":data.getString("WCLF");//材料费				
				 BigDecimal clfnum=new BigDecimal(clf);					 
				 String rgf=data.getString("WRGF").isEmpty()?"0":data.getString("WRGF");//人工费
				 BigDecimal rgfnum=new BigDecimal(rgf);				 
				 String wxf=data.getString("WX").isEmpty()?"0":data.getString("WX");//外协费
				 BigDecimal wxfnum=new BigDecimal(wxf);				 
				 String cgf=data.getString("WCGF").isEmpty()?"0":data.getString("WCGF");//采购费
				 BigDecimal cgfnum=new BigDecimal(cgf);	
				 String zl = data.getString("WZL").isEmpty()?"0":data.getString("WZL");// 重量
				BigDecimal zlnum = new BigDecimal(zl);
				String tj = data.getString("WTJ").isEmpty()?"0":data.getString("WTJ");// 体积
				BigDecimal tjnum = new BigDecimal(tj);
				 String isTrue="0"; 
				 for (RowMap rowMap : lists) {
					 //获取装配件子项的物料明细
					String BM=rowMap.getString("BM");//编码					
					//获取对应更新的物料信息
					if(userMap.containsKey(BM)) {
						 isTrue="1";
						String id=rowMap.getString("ID");//子项ID
						String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//数量
						 BigDecimal sl=new BigDecimal(SL);					 																													
						String DJ=rowMap.getString("DJ");//单价						
						String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价						
						String ZCLF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总材料费						
						String ZGSF=rowMap.getString("ZGSF");//总人工费
						String ZWX=rowMap.getString("ZWX");//总外协
						String ZCGF=rowMap.getString("ZCGF");//总采购费
						String ZZL = rowMap.getString("ZZL");// 总重量
						String ZTJ = rowMap.getString("ZTJ");// 总体积
						BigDecimal zjNew=new BigDecimal(ZJ);						
						BigDecimal zclfNew=new BigDecimal(ZCLF);						
						BigDecimal zgsfNew=new BigDecimal(ZGSF);
						BigDecimal zwxNew=new BigDecimal(ZWX);
						BigDecimal zcgfNew=new BigDecimal(ZCGF);
						BigDecimal zzlNew = new BigDecimal(ZZL);
						BigDecimal ztjNew = new BigDecimal(ZTJ);
						JSONObject json=userMap.get(BM);
						System.out.println("数量："+sl+"装配件编号："+BH+"制造件编号："+BM+"zjNew="+zjNew+",zclfNew="+zclfNew);

						String newdj=json.getString("DJ");												
						BigDecimal djNew=new BigDecimal(newdj);						
						//新的装配件总价=原装配件单价-子件总价+新子件单价x子件数量
						djnum=djnum.subtract(zjNew).add(djNew.multiply(sl));
						zjNew=djNew.multiply(sl);						
						//判断材料费是否相等,不相等，则计算当前装配件的材料费，并计算当前装配件子项的物料的材料费。
						String newclf=json.getString("CLF");						
						BigDecimal clfNew=new BigDecimal(newclf);						
						String CLF=rowMap.getString("CLF");//材料费						
						BigDecimal clfOld=new BigDecimal(CLF);						
						
							BigDecimal zclfOld=new BigDecimal(ZCLF);
							zclfNew=sl.multiply(clfNew);
							clfnum=clfnum.subtract(zclfOld).add(sl.multiply(clfNew));
											
						//判断人工费是否相等,不相等，则计算当前装配件的人工费，并计算当前装配件子项的物料的人工费。
						String newrgf=json.getString("RGF");
						BigDecimal rgfNew=new BigDecimal(newrgf);
						String RGF=rowMap.getString("RGF");//人工费
						BigDecimal rgfOld=new BigDecimal(RGF);
						
							BigDecimal zrgfOld=new BigDecimal(ZGSF);
							zgsfNew=sl.multiply(rgfNew);
							rgfnum=rgfnum.subtract(zrgfOld).add(sl.multiply(rgfNew));
						
						//判断外协费是否相等,不相等，则计算当前装配件的外协费，并计算当前装配件子项的物料的外协费。
						String newwx=json.getString("WXWG");
						BigDecimal wxNew=new BigDecimal(newwx);
						String WXWG=rowMap.getString("WXWG");//外协费
						BigDecimal wxOld=new BigDecimal(WXWG);
						
							BigDecimal zwxOld=new BigDecimal(ZWX);
							zwxNew=sl.multiply(wxNew);
							wxfnum=wxfnum.subtract(zwxOld).add(sl.multiply(wxNew));
						
						//判断采购费是否相等,不相等，则计算当前装配件的采购费，并计算当前装配件子项的物料的采购费。
						String newcgf=json.getString("CGF");
						BigDecimal cgfNew=new BigDecimal(newcgf);
						String CGF=rowMap.getString("CGF");//采购费
						BigDecimal cgfOld=new BigDecimal(CGF);
						
							BigDecimal zcgfOld=new BigDecimal(ZCGF);
							zcgfNew=sl.multiply(cgfNew);
							cgfnum=cgfnum.subtract(zcgfOld).add(sl.multiply(cgfNew));
						
						// 判断重量是否相等,不相等，则计算当前装配件的重量，并计算当前装配件子项的物料的重量。
						String newzl = json.getString("ZL").isEmpty()?"0":json.getString("ZL");
						BigDecimal zlNew = new BigDecimal(newzl);
						String ZL = rowMap.getString("ZL").isEmpty()?"0":rowMap.getString("ZL");// 重量
						BigDecimal zlOld = new BigDecimal(ZL);
						
							BigDecimal zzlOld = new BigDecimal(ZZL);
							zzlNew = sl.multiply(zlNew);
							zlnum = zlnum.subtract(zzlOld).add(sl.multiply(zlNew));
						
						// 判断体积是否相等,不相等，则计算当前装配件的体积，并计算当前装配件子项的物料的体积。
						String newtj = json.getString("TJ").isEmpty()?"0":json.getString("TJ");
						BigDecimal tjNew = new BigDecimal(newtj);
						String TJ = rowMap.getString("TJ").isEmpty()?"0":rowMap.getString("TJ");// 体积
						BigDecimal tjOld = new BigDecimal(TJ);
						
							BigDecimal ztjOld = new BigDecimal(ZTJ);
							ztjNew = sl.multiply(tjNew);
							tjnum = tjnum.subtract(ztjOld).add(sl.multiply(tjNew));
						
						//更新当前装配件子项的数据。
						//DJ=?,CLF=?,RGF=?,WXWG=?,CGF=?,ZJ=?,						
						System.out.println("数量："+sl+"装配件编号："+BH+"制造件编号："+BM+"zjNew="+zjNew+",zclfNew="+zclfNew);
						//DBSql.update(zjsql,new Object[] {newdj,newclf,newrgf,newwx,newcgf,newzl,newtj,zjNew,zclfNew,zgsfNew,zwxNew,zcgfNew,zzlNew,ztjNew,json.getString("NAME"),json.getString("TYPE"),json.getString("GG"),json.getString("TH"),json.getString("DW"),BM,id});						
						 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+newdj+"',CLF= '"+newclf+"' ,RGF='"+newrgf+"',WXWG='"+newwx+"'"
						 		+ ",CGF='"+newcgf+"',ZJ='"+zjNew+"',ZCLF='"+zclfNew+"',ZGSF='"+zgsfNew+"',ZWX='"+zwxNew+"',ZCGF='"+zcgfNew+"',"
						 				+ "MC='"+json.getString("NAME")+"',LX='"+json.getString("TYPE")+"',GG='"+json.getString("GG")+"',DH='"+json.getString("TH")+"',DW='"+json.getString("DW")+"' where BM='"+BM+"' and ID='"+id+"' ; ";
							//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
							sqlList.add(upSql);
						
						
					}
					
				}
				//更新装配件数据。
				 if(isTrue.equals("1")) {
					// DBSql.update(zpjsql, new Object[] {djnum,clfnum,rgfnum,wxfnum,cgfnum,zlnum,tjnum,key});
					 JSONObject json=new  JSONObject();
	    				json.put("DJ",djnum);	
	    				json.put("ZZFBL",data.getString("ZZFBL"));
	    				json.put("CLF",clfnum );	    				
	    				json.put("RGF",rgfnum);
	    				json.put("WXWG",wxfnum);
	    				json.put("CGF",cgfnum);
	    				json.put("ZL", zlnum);
						json.put("TJ", tjnum);
						json.put("BH",BH);
	    				json.put("NAME",data.getString("NAME"));
	    				json.put("TYPE",data.getString("TYPE"));
	    				json.put("GG",data.getString("GG"));
	    				json.put("TH",data.getString("TH"));
	    				json.put("DW",data.getString("DW"));
	    				 json.put("ZJS", "");
	    				//存放在
	    				//userMap.put(key, json);
	    				 //System.out.println("第一次更新装配件信息:"+json);
	    				zpjMap.put(key, json);
				 }	
			 				 						 
		}
		if(sqlList.size()>0) {
			 String[] array3 = sqlList.toArray(new String[sqlList.size()]);	
			 DBSql.batch(array3);
		}
		 
		 return zpjMap;
		 
	}
	/**
	 * 物料价格更新后，对装配件进行循环更新。
	 * @param zpjNewMap
	 * @return
	 */
	public static Map<String, JSONObject> getZPJMsgs(Map<String, JSONObject> zpjNewMap,Map<String,  List<RowMap>> aboutCPMap,String zpjsql,String zjsql){
		List<String> sqlList=new ArrayList<>();
		List<String> sqlLists=new ArrayList<>();
		try {
			Boolean is = true;
			List<String> list=new ArrayList<>();
			while (is) {
				int i=list.size();
				 for (String key : aboutCPMap.keySet()) {
					 List<RowMap> lists=aboutCPMap.get(key);
					 RowMap data=lists.get(0);
					 String dj=data.getString("JG").isEmpty()?"0":data.getString("JG");//单价					
					 String rgf=data.getString("WRGF").isEmpty()?"0":data.getString("WRGF");//人工费
					 String clf=data.getString("WCLF").isEmpty()?"0":data.getString("WCLF");//材料费					 
					 String wxf=data.getString("WX");//外协费
					 String cgf=data.getString("WCGF");//采购费
					 String zl = data.getString("WZL");// 重量
					 String tj = data.getString("WTJ");// 体积
					 String BH=data.getString("BH");//物料编号
					 String bhs="";
					//判断在已更新装配件map中是否存在
				 		if(zpjNewMap.containsKey(key)) {
				 			JSONObject json=zpjNewMap.get(key);
				 			rgf=json.getString("RGF");
				 			dj=json.getString("DJ");
				 			clf=json.getString("CLF");
				 			wxf=json.getString("WXWG");
				 			cgf=json.getString("CGF");
				 			zl=json.getString("ZL");
				 			tj=json.getString("TJ");
				 			bhs=json.getString("ZJS");
				 		}	
					 //物料编号不包含勾选的装配件编号数据。
						 BigDecimal djnum=new BigDecimal(dj);				 						
						 BigDecimal clfnum=new BigDecimal(clf);				 						 
						 BigDecimal rgfnum=new BigDecimal(rgf);				 
						 
						 BigDecimal wxfnum=new BigDecimal(wxf);				 
						
						 BigDecimal cgfnum=new BigDecimal(cgf);	
						
						BigDecimal zlnum = new BigDecimal(cgf);
						
						BigDecimal tjnum = new BigDecimal(cgf);
						 String isTrue="0"; 
						 for (RowMap rowMap : lists) {
							 //获取装配件子项的物料明细
							String BM=rowMap.getString("BM");//编码					
							//获取对应更新的物料信息
							if(zpjNewMap.containsKey(BM)) {
								/*
								 * 判断是之前更新过的装配件，如果是则判断该子项是否已经更新过，
								 * 如果更新过则不进行计算，如果没有则进行更新，并将更新后的数据进行记录，存放到map里面。
								 */
								
								if(zpjNewMap.containsKey(key)) {
									JSONObject json1=zpjNewMap.get(key);
									 //bhs=json1.getString("ZJS");
									if(bhs.isEmpty()||bhs.indexOf(BM)<0) {
										 isTrue="1";
										 String id=rowMap.getString("ID");//子项ID
											String SL=rowMap.getString("SL");//数量
											 BigDecimal sl=new BigDecimal(SL);					 																													
											String DJ=rowMap.getString("DJ");//单价
											
											String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价
											
											String ZCLF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总材料费
											
											String ZGSF=rowMap.getString("ZGSF").isEmpty()?"0":rowMap.getString("ZGSF");//总人工费
											String ZWX=rowMap.getString("ZWX").isEmpty()?"0":rowMap.getString("ZWX");//总外协
											String ZCGF=rowMap.getString("ZCGF").isEmpty()?"0":rowMap.getString("ZCGF");//总采购费
											String ZZL = rowMap.getString("ZZL").isEmpty()?"0":rowMap.getString("ZZL");// 总重量
											String ZTJ = rowMap.getString("ZTJ").isEmpty()?"0":rowMap.getString("ZTJ");// 总体积
											BigDecimal zjNew=new BigDecimal(ZJ);											
											BigDecimal zclfNew=new BigDecimal(ZCLF);			
											BigDecimal zgsfNew=new BigDecimal(ZGSF);
											BigDecimal zwxNew=new BigDecimal(ZWX);
											BigDecimal zcgfNew=new BigDecimal(ZCGF);
											BigDecimal zzlNew = new BigDecimal(ZZL);
											BigDecimal ztjNew = new BigDecimal(ZTJ);																																												
											JSONObject json=zpjNewMap.get(BM);
											String newdj=json.getString("DJ");
											
											BigDecimal djNew=new BigDecimal(newdj);
											
											//新的装配件总价=原装配件单价-子件总价+新子件单价x子件数量
											djnum=djnum.subtract(zjNew).add(djNew.multiply(sl));
											zjNew=djNew.multiply(sl);
											
											//判断材料费是否相等,不相等，则计算当前装配件的材料费，并计算当前装配件子项的物料的材料费。
											String newclf=json.getString("CLF");
											BigDecimal clfNew=new BigDecimal(newclf);										
																		
											
												BigDecimal zclfOld=new BigDecimal(ZCLF);
												zclfNew=sl.multiply(clfNew);
												clfnum=clfnum.subtract(zclfOld).add(sl.multiply(clfNew));
																					
											//判断人工费是否相等,不相等，则计算当前装配件的人工费，并计算当前装配件子项的物料的人工费。
											String newrgf=json.getString("RGF");
											BigDecimal rgfNew=new BigDecimal(newrgf);
											
											
												BigDecimal zrgfOld=new BigDecimal(ZGSF);
												zgsfNew=sl.multiply(rgfNew);
												rgfnum=rgfnum.subtract(zrgfOld).add(sl.multiply(rgfNew));
											
											//判断外协费是否相等,不相等，则计算当前装配件的外协费，并计算当前装配件子项的物料的外协费。
											String newwx=json.getString("WXWG");
											BigDecimal wxNew=new BigDecimal(newwx);
											
											
												BigDecimal zwxOld=new BigDecimal(ZWX);
												zwxNew=sl.multiply(wxNew);
												wxfnum=wxfnum.subtract(zwxOld).add(sl.multiply(wxNew));
											
											//判断采购费是否相等,不相等，则计算当前装配件的采购费，并计算当前装配件子项的物料的采购费。
											String newcgf=json.getString("CGF");
											BigDecimal cgfNew=new BigDecimal(newcgf);
											
										
												BigDecimal zcgfOld=new BigDecimal(ZCGF);
												zcgfNew=sl.multiply(cgfNew);
												cgfnum=cgfnum.subtract(zcgfOld).add(sl.multiply(cgfNew));
											
											// 判断重量是否相等,不相等，则计算当前装配件的重量，并计算当前装配件子项的物料的重量。
											String newzl = json.getString("ZL").isEmpty()?"0":json.getString("ZL");
											BigDecimal zlNew = new BigDecimal(newzl);
										
											
												BigDecimal zzlOld = new BigDecimal(ZZL);
												zzlNew = sl.multiply(zlNew);
												zlnum = zlnum.subtract(zzlOld).add(sl.multiply(zlNew));
											
											// 判断体积是否相等,不相等，则计算当前装配件的体积，并计算当前装配件子项的物料的体积。
											String newtj = json.getString("TJ").isEmpty()?"0":json.getString("TJ");
											BigDecimal tjNew = new BigDecimal(newtj);
											
											
												BigDecimal ztjOld = new BigDecimal(ZTJ);
												ztjNew = sl.multiply(tjNew);
												tjnum = tjnum.subtract(ztjOld).add(sl.multiply(tjNew));
											
											//更新当前装配件子项的数据。
											//DJ=?,CLF=?,RGF=?,WXWG=?,CGF=?,ZJ=?,
											System.out.println("名称"+data.getString("NAME")+"--物料名称："+json.getString("NAME")+"--"+json.toJSONString());
											//DBSql.update(zjsql,new Object[] {newdj,newclf,newrgf,newwx,newcgf,newzl,newtj,zjNew,zclfNew,zgsfNew,zwxNew,zcgfNew,zzlNew,ztjNew,json.getString("NAME"),json.getString("TYPE"),json.getString("GG"),json.getString("TH"),json.getString("DW"),BM,id});
											//DBSql.update(zjsql,new Object[] {newdj,newclf,newrgf,newwx,newcgf,newzl,newtj,zjNew,zclfNew,zgsfNew,zwxNew,zcgfNew,zzlNew,ztjNew,json.getString("NAME"),json.getString("TYPE"),json.getString("GG"),json.getString("TH"),json.getString("DW"),BM,id});
											String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+newdj+"',CLF= '"+newclf+"' ,RGF='"+newrgf+"',WXWG='"+newwx+"'"
											 		+ ",CGF='"+newcgf+"',ZJ='"+zjNew+"',ZCLF='"+zclfNew+"',ZGSF='"+zgsfNew+"',ZWX='"+zwxNew+"',ZCGF='"+zcgfNew+"',"
											 				+ "MC='"+json.getString("NAME")+"',LX='"+json.getString("TYPE")+"',GG='"+json.getString("GG")+"',DH='"+json.getString("TH")+"',DW='"+json.getString("DW")+"' where BM='"+BM+"' and ID='"+id+"' ; ";
												//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
												sqlLists.add(upSql);
											//将子项的编号存放在bhs中
											if(bhs.isEmpty()) {
												bhs=BM;
											}else {
												bhs=bhs+","+BM;
											}
									}
									
								}else {
									isTrue="1";
									 String id=rowMap.getString("ID");//子项ID
										String SL=rowMap.getString("SL");//数量
										 BigDecimal sl=new BigDecimal(SL);					 																													
										String DJ=rowMap.getString("DJ");//单价										
										String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价										
										String ZCLF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总材料费						
										String ZGSF=rowMap.getString("ZGSF").isEmpty()?"0":rowMap.getString("ZGSF");//总人工费
										String ZWX=rowMap.getString("ZWX").isEmpty()?"0":rowMap.getString("ZWX");//总外协
										String ZCGF=rowMap.getString("ZCGF").isEmpty()?"0":rowMap.getString("ZCGF");//总采购费
										String ZZL = rowMap.getString("ZZL").isEmpty()?"0":rowMap.getString("ZZL");// 总重量
										String ZTJ = rowMap.getString("ZTJ").isEmpty()?"0":rowMap.getString("ZTJ");// 总体积
										BigDecimal zjNew=new BigDecimal(ZJ);										
										BigDecimal zclfNew=new BigDecimal(ZCLF);										
										BigDecimal zgsfNew=new BigDecimal(ZGSF);
										BigDecimal zwxNew=new BigDecimal(ZWX);
										BigDecimal zcgfNew=new BigDecimal(ZCGF);
										BigDecimal zzlNew = new BigDecimal(ZZL);
										BigDecimal ztjNew = new BigDecimal(ZTJ);
										JSONObject json=zpjNewMap.get(BM);
										String newdj=json.getString("DJ");										
										BigDecimal djNew=new BigDecimal(newdj);										
										//新的装配件总价=原装配件单价-子件总价+新子件单价x子件数量
										djnum=djnum.subtract(zjNew).add(djNew.multiply(sl));
										zjNew=djNew.multiply(sl);										
										//判断材料费是否相等,不相等，则计算当前装配件的材料费，并计算当前装配件子项的物料的材料费。
										String newclf=json.getString("CLF");										
										BigDecimal clfNew=new BigDecimal(newclf);										
																		
										
											BigDecimal zclfOld=new BigDecimal(ZCLF);
											zclfNew=sl.multiply(clfNew);
											clfnum=clfnum.subtract(zclfOld).add(sl.multiply(clfNew));
										
										
										//判断人工费是否相等,不相等，则计算当前装配件的人工费，并计算当前装配件子项的物料的人工费。
										String newrgf=json.getString("RGF");
										BigDecimal rgfNew=new BigDecimal(newrgf);
										
										
											BigDecimal zrgfOld=new BigDecimal(ZGSF);
											zgsfNew=sl.multiply(rgfNew);
											rgfnum=rgfnum.subtract(zrgfOld).add(sl.multiply(rgfNew));
										
										//判断外协费是否相等,不相等，则计算当前装配件的外协费，并计算当前装配件子项的物料的外协费。
										String newwx=json.getString("WXWG");
										BigDecimal wxNew=new BigDecimal(newwx);
										
										
											BigDecimal zwxOld=new BigDecimal(ZWX);
											zwxNew=sl.multiply(wxNew);
											wxfnum=wxfnum.subtract(zwxOld).add(sl.multiply(wxNew));
										
										//判断采购费是否相等,不相等，则计算当前装配件的采购费，并计算当前装配件子项的物料的采购费。
										String newcgf=json.getString("CGF");
										BigDecimal cgfNew=new BigDecimal(newcgf);
										
										
											BigDecimal zcgfOld=new BigDecimal(ZCGF);
											zcgfNew=sl.multiply(cgfNew);
											cgfnum=cgfnum.subtract(zcgfOld).add(sl.multiply(cgfNew));
										
										// 判断重量是否相等,不相等，则计算当前装配件的重量，并计算当前装配件子项的物料的重量。
										String newzl = json.getString("ZL").isEmpty()?"0":json.getString("ZL");
										BigDecimal zlNew = new BigDecimal(newzl);
										
										
											BigDecimal zzlOld = new BigDecimal(ZZL);
											zzlNew = sl.multiply(zlNew);
											zlnum = zlnum.subtract(zzlOld).add(sl.multiply(zlNew));
										
										// 判断体积是否相等,不相等，则计算当前装配件的体积，并计算当前装配件子项的物料的体积。
										String newtj = json.getString("TJ").isEmpty()?"0":json.getString("TJ");
										BigDecimal tjNew = new BigDecimal(newtj);
										
										
											BigDecimal ztjOld = new BigDecimal(ZTJ);
											ztjNew = sl.multiply(tjNew);
											tjnum = tjnum.subtract(ztjOld).add(sl.multiply(tjNew));
										
										//更新当前装配件子项的数据。
										//DJ=?,CLF=?,RGF=?,WXWG=?,CGF=?,ZJ=?,
										//DBSql.update(zjsql,new Object[] {newdj,newclf,newrgf,newwx,newcgf,newzl,newtj,zjNew,zclfNew,zgsfNew,zwxNew,zcgfNew,zzlNew,ztjNew,json.getString("NAME"),json.getString("TYPE"),json.getString("GG"),json.getString("TH"),json.getString("DW"),BM,id});
										//DBSql.update(zjsql,new Object[] {newdj,newclf,newrgf,newwx,newcgf,newzl,newtj,zjNew,zclfNew,zgsfNew,zwxNew,zcgfNew,zzlNew,ztjNew,json.getString("NAME"),json.getString("TYPE"),json.getString("GG"),json.getString("TH"),json.getString("DW"),BM,id});
										String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+newdj+"',CLF= '"+newclf+"' ,RGF='"+newrgf+"',WXWG='"+newwx+"'"
										 		+ ",CGF='"+newcgf+"',ZJ='"+zjNew+"',ZCLF='"+zclfNew+"',ZGSF='"+zgsfNew+"',ZWX='"+zwxNew+"',ZCGF='"+zcgfNew+"',"
										 				+ "MC='"+json.getString("NAME")+"',LX='"+json.getString("TYPE")+"',GG='"+json.getString("GG")+"',DH='"+json.getString("TH")+"',DW='"+json.getString("DW")+"' where BM='"+BM+"' and ID='"+id+"' ; ";
											//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
											sqlLists.add(upSql);
										//将子项的编号存放在bhs中
											if(bhs.isEmpty()) {
												bhs=BM;
											}else {
												bhs=bhs+","+BM;
											}
								}
								
								
							}
							
						}
						//更新装配件数据。
						 if(isTrue.equals("1")) {
							// DBSql.update(zpjsql, new Object[] {djnum,clfnum,rgfnum,wxfnum,cgfnum,zlnum,tjnum,key});
							 JSONObject json=new  JSONObject();
			    				json.put("DJ",djnum);	
			    				json.put("ZZFBL",data.getString("ZZFBL"));
			    				json.put("CLF",clfnum );			    				
			    				json.put("RGF",rgfnum);
			    				json.put("WXWG",wxfnum);
			    				json.put("CGF",cgfnum);
			    				json.put("ZL", zlnum);
								json.put("TJ", tjnum);
			    				json.put("BH",BH);
			    				json.put("NAME",data.getString("NAME"));
			    				json.put("TYPE",data.getString("TYPE"));
			    				json.put("GG",data.getString("GG"));
			    				json.put("TH",data.getString("TH"));
			    				json.put("DW",data.getString("DW"));
			    				json.put("ZJS", bhs);
			    				//存放在
			    				//userMap.put(key, json);
			    				 zpjNewMap.put(key, json);
			    				 list.add(BH);
						 }	
					 				 						 
				}
				// 如果获取的装配件的数量大于之前的数量，说明有有新增更新的装配件数据，如果没有则已经更新完毕,跳出循环。
					if (list.size()==i) {
						is = false;
					} 

			}
			//将获取到的装配件进行更新
			if(zpjNewMap.size()>0) {
				for (String key : zpjNewMap.keySet()) {
					JSONObject json=zpjNewMap.get(key);
					System.out.println("json:"+json);
					String dj=json.getString("DJ");
					String clf=json.getString("CLF");
					String rgf=json.getString("RGF");
					String bl=json.getString("ZZFBL").isEmpty()?"0":json.getString("ZZFBL");
					BigDecimal djnum = new BigDecimal(dj);
					BigDecimal clnum = new BigDecimal(clf);
					BigDecimal rgnum = new BigDecimal(rgf);
					BigDecimal blnum = new BigDecimal(bl);
					BigDecimal num = new BigDecimal("100");
					BigDecimal num1 = new BigDecimal("1");
					BigDecimal zzf=	clnum.add(rgnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));				
					//System.out.println("更新的装配件信息："+json);										
					//DBSql.update(zpjsql,new Object[] {json.getString("DJ"),json.getString("CLF"),json.getString("RGF"),json.getString("WXWG"),json.getString("CGF"),json.getString("ZL"),json.getString("TJ"),zzf,zzf.add(djnum),json.getString("BH")});
					 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+json.getString("DJ")+"',CLF= '"+json.getString("CLF")+"' ,RGF='"+json.getString("RGF")+"',WXWG='"+json.getString("WXWG")+"',ZZF='"+zzf+"',DJZZF='"+zzf.add(djnum)+"' where BM='"+json.getString("BH")+"' ; ";
						//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
						sqlList.add(upSql);
				}
			}
			
			if(sqlList.size()>0) {
				 String[] array3 = sqlList.toArray(new String[sqlList.size()]);	
				 DBSql.batch(array3);
			}
			if(sqlLists.size()>0) {
				String[] array2 = sqlLists.toArray(new String[sqlLists.size()]);					
				DBSql.batch(array2);  
			}	

			 return zpjNewMap;
		} catch (Exception e) {
			throw  e;
		}
		
		
	}
	/**
	 * 原材料价格进行更新后，对物料中的制造件价格进行更新。
	 * @param userMap
	 * @return
	 */
	public static Map<String, JSONObject> getManufacturedPart(Map<String, JSONObject> userMap){
		try {
			 //存放更新后的制造件
		     Map<String, JSONObject> comtMap = new HashMap<String, JSONObject>();
			String mpSql="select   a.ID,a.BM,a.CLDJ,a.ZL,"
					+ "a.CLF,"
					+ "b.BM as BH,b.ZZFBL,b.ZL as WZL,b.TJ as WTJ,b.DJ as JG,"
					+ "b.CLF as WCLF,"
					+ "b.RGF as WRGF,b.WXWG as WX,b.CGF as WCGF "
					+ "from  BO_EU_CPQ_COMPONENT_PART_PROPERTIES_GRID a, BO_EU_CPQ_COMPONENT_PART b "
					+ "where  a.BINDID=b.BINDID and  b.TYPE='制造件' ";
			List<RowMap> mpMaps=DBSql.getMaps(mpSql);
			// 存放制造件信息
			Map<String, List<RowMap>> aboutCPMap = new HashMap<>();
						if (mpMaps.size() > 0) {
							for (RowMap rowMap : mpMaps) {
								String bh = rowMap.getString("BH");
								if (aboutCPMap.containsKey(bh)) {
									List<RowMap> lists = aboutCPMap.get(bh);
									lists.add(rowMap);
									aboutCPMap.put(bh, lists);
								} else {
									List<RowMap> lists = new ArrayList<RowMap>();
									lists.add(rowMap);
									aboutCPMap.put(bh, lists);
								}

							}
						}
						
		     String zzjsql = "update BO_EU_CPQ_COMPONENT_PART_PROPERTIES_GRID set CLDJ=?,"
		     		+ "CLF=?,MC=?,LX=?,DW=?,XH=? where BM=? and ID=?";
		     String wlsql = "update BO_EU_CPQ_COMPONENT_PART set DJ=?,CLF=?,ZZF=?,DJZZF=? "
		     		+ " where BM=? ";
            
			//遍历制造件map，判断制造件中是否有更新的原材料信息，有则进行更新制造件的价格，并将更新后的原材料存放至更新后的map中。	
		     List<String> sqlList=new ArrayList<>();
			for (String key : aboutCPMap.keySet()) {
				 List<RowMap> lists=aboutCPMap.get(key);
				 RowMap data=lists.get(0);
				 String dj=data.getString("JG");//单价				 
				 String BH=data.getString("BH");//物料编号
				 BigDecimal djnum=new BigDecimal(dj);					 
				 String clf=data.getString("WCLF").isEmpty()?"0":data.getString("WCLF");//制造件材料费				 				 
				 BigDecimal clfnum=new BigDecimal(clf);					
				 String isTrue="0"; 
				 for (RowMap rowMap : lists) {
					 //获取装配件子项的物料明细
						String BM=rowMap.getString("BM");//编码
						String ID=rowMap.getString("ID");//子件材料ID		
						//获取对应更新的物料信息
						if(userMap.containsKey(BM)) {
							 isTrue="1";
							 String ZL=rowMap.getString("ZL").isEmpty()?"0":rowMap.getString("ZL");//材料重量
							 BigDecimal zl=new BigDecimal(ZL);	
							 String CLF=rowMap.getString("CLF").isEmpty()?"0":rowMap.getString("CLF");;//材料费							 
							 BigDecimal clfOld=new BigDecimal(CLF);							
							 //获取对应的原材料单价
							 JSONObject json=userMap.get(BM);
							 String cldj=json.getString("CLDJ");							 					 
							// 新的制造件的材料费=原制造件材料费-子件的原材料费+新子件材料单价x材料重量
							 BigDecimal cldjNew=new BigDecimal(cldj);							
							 if(cldjNew.compareTo(BigDecimal.ZERO)==0) {
								 throw new BPMNError("003","材料名称为："+json.getString("MC")+"的材料中期货价格没有，请填写后进行计算。");
							 }
								 BigDecimal  clfNew=cldjNew.multiply(zl);
								 clfnum=clfnum.subtract(clfOld).add(clfNew);
								 //新的制造件的单价=原制造件单价-子件的原材料费+新子件材料单价x材料重量
								 djnum=djnum.subtract(clfOld).add(clfNew);
						     //对入库材料费进行计算						
					    //对该子件材料进行更新
						// CLDJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,"
			     		//+ "RKJ=?,CLF=?,LSJCLF=?,BGLSJCLF=?,RGLSJCLF=?,JGLSJCLF=?,QTNCLF=?,
						//QTTCLF=?,RKJCLF=?,MC=?,LX=?,DW=?
					   /**
					    *  DBSql.update(zzjsql,new Object[] {cldjNew,
					    *  clfNew,
					    json.getString("MC"),json.getString("LX"),json.getString("DW"),json.getString("XH"),BM,ID});
					    */
					    		
					    String upSql= "update BO_EU_CPQ_COMPONENT_PART_PROPERTIES_GRID set CLDJ= '"+cldjNew+"',CLF= '"+clfNew+"' ,MC='"+json.getString("MC")+"',LX='"+json.getString("LX")+"',DW='"+json.getString("DW")+"',XH='"+json.getString("XH")+"' where BM='"+BM+"' and ID='"+ID+"'; ";
						//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
						sqlList.add(upSql);
						}
				 }
				// 更新制造件价格
					if (isTrue.equals("1")) {
						/**
						 * update BO_EU_CPQ_COMPONENT_PART set DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,CLF=?,"
		     		+ "LSJCLF=?,RKJCLF=?,BGLSJCLF=?,RGLSJCLF=?,JGLSJCLF=?,QTNCLF=?,QTTCLF=? where BM=? 
						 */

						String rgf=data.getString("WRGF");
						String bl=data.getString("ZZFBL").isEmpty()?"0":data.getString("ZZFBL");

						BigDecimal rgnum = new BigDecimal(rgf);
						BigDecimal blnum = new BigDecimal(bl);
						BigDecimal num = new BigDecimal("100");
						BigDecimal num1 = new BigDecimal("1");
						BigDecimal zzf=	clfnum.add(rgnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));
						/**
						 *  DBSql.update(wlsql,new Object[] {djnum,
						 *   clfnum,zzf,zzf.add(djnum),
								 BH});
						 */
					    String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+djnum+"',CLF= '"+clfnum+"' ,ZZF='"+zzf+"',DJZZF='"+zzf.add(djnum)+"'  where BM='"+BH+"' ; ";
						sqlList.add(upSql);
						 JSONObject json=new  JSONObject();
						 json.put("DJ",djnum );						 
						 json.put("CLF", clfnum);						 
						 json.put("BM", BH);
						 json.put("ZJS", "");
						 comtMap.put(BH, json);
					}
			}
			if(sqlList.size()>0) {
				String[] array3 = sqlList.toArray(new String[sqlList.size()]);
				DBSql.batch(array3);
			}

			return  comtMap;
		} catch (Exception e) {
			throw e;
		}
		
	}
	/**
	 * 对原材料价格更新后，对物料中的装配价格件进行更新
	 * @param comtMap
	 * @return
	 */
	public static Map<String, JSONObject> getAssembly(Map<String, JSONObject> comtMap){
		try {
			Map<String, JSONObject> cpMap = new HashMap<String, JSONObject>();
			if(comtMap.size()>0) {
				String allCPsql = "select   a.BM,a.ID,a.SL,a.CLF,"
						+ "a.DJ,"
						+ "a.ZJ,"
						+ "a.ZCLF,"
						+ "b.BM as BH,b.ZZFBL,b.DJ as JG,"
						+ "b.CLF as WCLF,b.RGF "
						+ "from  BO_EU_CPQ_COMPONENT_PART_GRID a, BO_EU_CPQ_COMPONENT_PART b "
						+ "where  a.BINDID=b.BINDID and  b.TYPE='装配件' ";
				List<RowMap> allmaps = DBSql.getMaps(allCPsql);
				// 存放需要更新的装配件信息
				Map<String, List<RowMap>> aboutCPMap = new HashMap<>();
				if (allmaps.size() > 0) {
					for (RowMap rowMap : allmaps) {
						String bh = rowMap.getString("BH");
						if (aboutCPMap.containsKey(bh)) {
							List<RowMap> lists = aboutCPMap.get(bh);
							lists.add(rowMap);
							aboutCPMap.put(bh, lists);
						} else {
							List<RowMap> lists = new ArrayList<RowMap>();
							lists.add(rowMap);
							aboutCPMap.put(bh, lists);
						}

					}
				}
			     String zzjsql = "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ=?,"
			     		+ "CLF=?,"
			     		+ "ZJ=?,"
			     		+ "ZCLF=? "
			     		+ "where BM=? and ID=?";
			     String wlsql = "update BO_EU_CPQ_COMPONENT_PART set DJ=?,"
			     		+ "CLF=?,ZZF=?,DJZZF=? "
			     		+ "where BM=? ";
			   //遍历装配件map，判断装配件中是否有更新的制造件信息，有则进行更新装配件的价格，并将更新后的装配件存放至更新后的map中。
			     List<String> sqlList=new ArrayList<>();
					for (String key : aboutCPMap.keySet()) {
						 List<RowMap> lists=aboutCPMap.get(key);
						 RowMap data=lists.get(0);
						 String dj=data.getString("JG");//装配件单价						 
						 String BH=data.getString("BH");//装配件编号
						 BigDecimal djnum=new BigDecimal(dj);							
						 String clf=data.getString("WCLF").isEmpty()?"0":data.getString("WCLF");//装配件材料费						 
						 BigDecimal clfnum=new BigDecimal(clf);		
						 String isTrue="0"; 
						 for (RowMap rowMap : lists) {
							 //获取装配件子项的物料明细
								String BM=rowMap.getString("BM");//编码
								String ID=rowMap.getString("ID");//子件材料ID		
								//获取对应更新的物料信息
								if(comtMap.containsKey(BM)) {
									 isTrue="1";
									 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
									 BigDecimal sl=new BigDecimal(SL);	
									 //ZLSJCLF=?,ZBGLSJCLF=?,ZRGLSJCLF=?,ZJGLSJCLF=?,ZQTNCLF=?,ZQTTCLF=?,ZRKJCLF=?
									 String ZCLF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总材料费									
									 BigDecimal zclfOld=new BigDecimal(ZCLF);									
									 //ZLSJ=?,ZBGLSJ=?,ZJGLSJ=?,ZRGLSJ=?,ZQTJN=?,ZQTJGT=?,ZRKJ=?
									 String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总材料费									 									 
									 BigDecimal zjOld=new BigDecimal(ZJ);									
									 //获取对应的原材料单价
									 JSONObject json=comtMap.get(BM);
									 String cldj=json.getString("DJ");									 
									 BigDecimal cldjNew=new BigDecimal(cldj);									 
									 /**
									  * json.put("RKJCLF", clfnum);
						 json.put("LSJCLF", clfnum);
						 json.put("BGLSJCLF", clfnum);
						 json.put("RGLSJCLF", clfnum);
						 json.put("JGLSJCLF", clfnum);
						 json.put("QTNCLF", clfnum);
						 json.put("QTTCLF", clfnum);
									  */
									 String CLF=json.getString("CLF");									 									 
									 BigDecimal clfNew=new BigDecimal(CLF);									 
									// 新的装配件的材料费=原装配件材料费-子件的原材料费总价+新子件材料费x数量									
									 BigDecimal  zclfNew=clfNew.multiply(sl);
									 clfnum=clfnum.subtract(zclfOld).add(zclfNew);
									 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
									 BigDecimal  zjNew=cldjNew.multiply(sl);
									 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));
									
									 //对该子件材料进行更新
									 /**
									  *   String zzjsql = "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,"
			     		+ "CLF=?,LSJCLF=?,BGLSJCLF=?,RGLSJCLF=?,JGLSJCLF=?,QTNCLF=?,QTTCLF=?,RKJCLF=?,"
			     		+ "ZJ=?,ZLSJ=?,ZBGLSJ=?,ZJGLSJ=?,ZRGLSJ=?,ZQTJN=?,ZQTJGT=?,ZRKJ=?,"
			     		+ "ZCLF=?,ZLSJCLF=?,ZBGLSJCLF=?,ZRGLSJCLF=?,ZJGLSJCLF=?,ZQTNCLF=?,ZQTTCLF=?,ZRKJCLF=? "
			     		 BigDecimal cldjNew=new BigDecimal(cldj);
									 BigDecimal rkcldjNew=new BigDecimal(rkcldj);
									 BigDecimal qtncldjNew=new BigDecimal(qtncldj);
									 BigDecimal qttcldjNew=new BigDecimal(qttcldj);
									 BigDecimal sgcldjNew=new BigDecimal(sgcldj);
									 BigDecimal bgcldjNew=new BigDecimal(bgcldj);
									 BigDecimal rgcldjNew=new BigDecimal(rgcldj);
									 BigDecimal jgcldjNew=new BigDecimal(jgcldj);
									  */
									/*
									 *  DBSql.update(zzjsql,new Object[] {cldjNew,
									 *   clfNew,
											 zjNew,
											 zclfNew,BM,ID});
									 */
											
									String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '%s',CLF= '%s' ,ZJ='%s',ZCLF='%s' where BM='"+BM+"' and ID='%s'; ";
									upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
									sqlList.add(upSql);
								}
						 }
						// 更新装配件数据。
							if (isTrue.equals("1")) {
								 //DBSql.update(zzjsql,new Object[] {djnum,clfnum,BH});
								 JSONObject json=new  JSONObject();
								 json.put("DJ",djnum );								 
								 json.put("ZZFBL", data.getString("ZZFBL"));	
								 json.put("RGF",  data.getString("RGF"));
								 json.put("CLF", clfnum);
								 json.put("BM", BH);
								 json.put("ZJS","");
								 cpMap.put(BH, json);
							}
					}
					/**
					 * 循环遍历新的装配件，如果遍历的装配件中存在与第一次更新的装配件一样，则去第一次的装配件数据进行更新，并存放到新的装配件map中。
					 * 直到装配件map的数据没有新增后，跳出循环，并更新装配件的数据。
					 * 
					 */
					Boolean is = true;
					List<String> list=new ArrayList<>();
					while (is) {
						int i=list.size();
						for (String key : aboutCPMap.keySet()) {
					 		List<RowMap> lists=aboutCPMap.get(key);
					 		 RowMap data=lists.get(0);
					 		String rgf=data.getString("WCLF").isEmpty()?"0":data.getString("WCLF");//装配件材料费
					 		
							 String dj=data.getString("JG");//装配件单价
							 
							 String bhs="";
					 		//判断在已更新装配件map中是否存在
					 		if(cpMap.containsKey(key)) {
					 			JSONObject json=cpMap.get(key);
					 			rgf=json.getString("CLF");					 			
					 			dj=json.getString("DJ");					 			
					 			bhs=json.getString("ZJS");
					 		}						
							 String BH=data.getString("BH");//装配件编号
							 BigDecimal djnum=new BigDecimal(dj);
							
							 BigDecimal rgfnum=new BigDecimal(rgf);	
							 
							 String isTrue="0"; 
							 
							 for (RowMap rowMap : lists) {
								//获取装配件子项的物料明细
								String BM=rowMap.getString("BM");//编码
								String ID=rowMap.getString("ID");//子件材料ID								
								//获取对应更新的物料信息,判断是否存在更新的物料信息
								if(cpMap.containsKey(BM)) {
									/*
									 * 判断是之前更新过的装配件，如果是则判断该子项是否已经更新过，
									 * 如果更新过则不进行计算，如果没有则进行更新，并将更新后的数据进行记录，存放到map里面。
									 */
									if(key.equals("L6J070053")) {
										System.out.println("BM:"+BM+",单价："+djnum);
									}
									if(cpMap.containsKey(key)) {	
										JSONObject json1=cpMap.get(key);
										
										if(bhs.isEmpty()||bhs.indexOf(BM)<0) {
											isTrue="1";
											 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
											 BigDecimal sl=new BigDecimal(SL);	
											// String ZGSF=rowMap.getString("ZGSF");//总工时费
											 String ZCLF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总期货材料费											
											 //BigDecimal zgsfOld=new BigDecimal(ZGSF);
											 BigDecimal zclfOld=new BigDecimal(ZCLF);											
											 String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价											 
											 BigDecimal zjOld=new BigDecimal(ZJ);											
											 //获取对应的原材料单价
											 JSONObject json=cpMap.get(BM);
											 String cldj=json.getString("DJ");																																	 
											 BigDecimal cldjNew=new BigDecimal(cldj);
											 String CLF=json.getString("CLF");
											 BigDecimal clfNew=new BigDecimal(CLF);
											// 新的装配件的材料费=原装配件工时费-子件的原材料费总价+新子件材料费x数量									
											 BigDecimal  zclfNew=clfNew.multiply(sl);
											 rgfnum=rgfnum.subtract(zclfOld).add(zclfNew);
											 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
											 BigDecimal  zjNew=cldjNew.multiply(sl);
											 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));														 
											 //对该子件材料进行更新
											 /**
											  * DBSql.update(zzjsql,new Object[] {cldjNew,cldjNew,
											  *  zjNew,
													 zclfNew,BM,ID});
											  */
													
											 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '%s',CLF= '%s' ,ZJ='%s',ZCLF='%s' where BM='"+BM+"' and ID='%s'; ";
												upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
												sqlList.add(upSql);
												if(key.equals("L6J070053")) {
													System.out.println("BM:"+BM+",单价："+djnum+",sql======"+upSql);
												}
										     //将子项的编号存放在bhs中
											if(bhs.isEmpty()) {
												bhs=BM;
											}else {
												bhs=bhs+","+BM;
											}
										}
									}else {
										isTrue="1";
										 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
										 BigDecimal sl=new BigDecimal(SL);	
										 String ZGSF=rowMap.getString("ZCLF").isEmpty()?"0":rowMap.getString("ZCLF");//总材料费										
										 BigDecimal zgsfOld=new BigDecimal(ZGSF);										
										 String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价										 
										 BigDecimal zjOld=new BigDecimal(ZJ);										 
										 //获取对应的原材料单价
										 JSONObject json=cpMap.get(BM);
										 String cldj=json.getString("DJ");							 
										 BigDecimal cldjNew=new BigDecimal(cldj);
										 String RGF=json.getString("CLF");
										 BigDecimal refNew=new BigDecimal(RGF);
										// 新的装配件的材料费=原装配件材料费-子件的原材料费总价+新子件材料费x数量									
										 BigDecimal  zgsfNew=refNew.multiply(sl);
										 rgfnum=rgfnum.subtract(zgsfOld).add(zgsfNew);
										 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
										 BigDecimal  zjNew=cldjNew.multiply(sl);
										 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));
										
										 //对该子件材料进行更新
										/**
										 *  DBSql.update(zzjsql,new Object[] {cldjNew,
										 *   refNew,
												 zjNew,
												 zgsfNew,BM,ID});
										 */
												
										 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '%s',CLF= '%s' ,ZJ='%s',ZCLF='%s' where BM='"+BM+"' and ID='%s'; ";
											upSql=String.format(upSql, cldjNew,refNew,zjNew,zgsfNew,ID);
											sqlList.add(upSql);
											if(key.equals("L6J070053")) {
												System.out.println("BM:"+BM+",单价："+djnum+",sql"+upSql);
											}

									     //将子项的编号存放在bhs中
											//将子项的编号存放在bhs中
											if(bhs.isEmpty()) {
												bhs=BM;
											}else {
												bhs=bhs+","+BM;
											}
											
									}
									 
								}
						 }
						// 更新装配件数据。
							if (isTrue.equals("1")) {
								   i++;
								 //DBSql.update(zzjsql,new Object[] {djnum,rgfnum,BH});
								 JSONObject json=new  JSONObject();
								 json.put("DJ",djnum );								 
								 json.put("CLF", rgfnum);	
								 json.put("ZZFBL", data.getString("ZZFBL"));	
								 json.put("RGF",  data.getString("RGF"));
								 json.put("BM", BH);
								 json.put("ZJS", bhs);
								 cpMap.put(BH, json);
								 if(key.equals("L6J070053")) {
										System.out.println("BM:"+BH+",单价："+djnum+",json"+json);
									}

								 list.add(BH);
							}
							 
				
					 	}
						// 如果获取的装配件的数量大于之前的数量，说明有有新增更新的装配件数据，如果没有则已经更新完毕,跳出循环。
						if (list.size()==i) {
							is = false;
						} 

					}
					//更新装配件子件信息
					if(sqlList.size()>0) {
						String[] array2 = sqlList.toArray(new String[sqlList.size()]);
						DBSql.batch(array2);
					}
					
					
					//将获取到的装配件进行更新
					List<String> zpSql=new ArrayList<>();
					if(cpMap.size()>0) {
						for (String key : cpMap.keySet()) {
							JSONObject json=cpMap.get(key);
							/**
							 * DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?"
			     		+ "CLF=?,LSJCLF=?,BGLSJCLF=?,RGLSJCLF=?,JGLSJCLF=?,QTNCLF=?,QTTCLF=?,RKJCLF=? "
			     		+ "where BM=? ";
							 */
							String dj=json.getString("DJ");
							String rgf=json.getString("RGF");
							String bl=json.getString("ZZFBL").isEmpty()?"0":json.getString("ZZFBL");
							String clf =json.getString("CLF");
							BigDecimal djnum = new BigDecimal(dj);
							BigDecimal clfnum = new BigDecimal(clf);
							BigDecimal rgnum = new BigDecimal(rgf);
							BigDecimal blnum = new BigDecimal(bl);
							BigDecimal num = new BigDecimal("100");
							BigDecimal num1 = new BigDecimal("1");
							BigDecimal zzf=	clfnum.add(rgnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));
							//DBSql.update(wlsql,new Object[] {json.getString("DJ"),json.getString("CLF"),zzf,zzf.add(djnum),json.getString("BM")});
							 String szpSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '%s',CLF= '%s' ,ZZF='%s',DJZZF='%s' where BM='"+json.getString("BM")+"'; ";
							 szpSql=String.format(szpSql, djnum,clfnum,zzf,zzf.add(djnum));
							 zpSql.add(szpSql);
						}						
					}
					if(zpSql.size()>0) {
						String[] array3 = zpSql.toArray(new String[zpSql.size()]);
						DBSql.batch(array3);
					}

					//将制造件的更新的数据和装配件的数据整合到一起
					if(comtMap.size()>0) {
						for (String key : comtMap.keySet()) {
							cpMap.put(key, comtMap.get(key));
						}
					}
					
			}			
			return  cpMap;
		} catch (Exception e) {
			throw e;
		}
		
		
	}
	/**
	 * 对人工单价进行更新后，物料中的制造件和装配件进行更新
	 * @param userMap
	 * @return
	 */
	public static Map<String, JSONObject> wageRateRefreshAssembly‌(Map<String, JSONObject> userMap){
		try {
			 //查询所涉及的制造件和装配件

			String mpSql="select   a.ID,a.BM,a.PRICE,a.TOTAL_PRICE,a.JJDJ,a.GS,a.JDL,a.NUMBER,"
					+ "b.BM as BH,b.TYPE,b.DJ as JG,"
					+ "b.RGF,b.CLF,b.ZZFBL  "
					+ "from  BO_EU_BO_EU_CPQ_COMPONENT_PART_USER_PRICE_GRID a, BO_EU_CPQ_COMPONENT_PART b "
					+ "where  a.BINDID=b.BINDID and  b.TYPE in('制造件','装配件') ";
			List<RowMap> mpMaps=DBSql.getMaps(mpSql);
			//1、将所涉及的装配件和制造件进行价格更新，更新后将制造件数据和装配件数据分别存放在map中。
			Map<String, List<RowMap>> aboutCPMap = new HashMap<>();
			if (mpMaps.size() > 0) {
				for (RowMap rowMap : mpMaps) {
					String bh = rowMap.getString("BH");
					if (aboutCPMap.containsKey(bh)) {
						List<RowMap> lists = aboutCPMap.get(bh);
						lists.add(rowMap);
						aboutCPMap.put(bh, lists);
					} else {
						List<RowMap> lists = new ArrayList<RowMap>();
						lists.add(rowMap);
						aboutCPMap.put(bh, lists);
					}

				}
			}
		     String zzjsql = "update BO_EU_BO_EU_CPQ_COMPONENT_PART_USER_PRICE_GRID set PRICE=?,TOTAL_PRICE=?,JJDJ=? where BM=? and ID=?";
		     String wlsql = "update BO_EU_CPQ_COMPONENT_PART set DJ=?,"
		     		+ "RGF=?,ZZF=?,DJZZF=? where BM=? ";
		    Map<String, JSONObject> comtMap = new HashMap<String, JSONObject>();
			Map<String, JSONObject> WLMap = new HashMap<>();
			List<String> sqlList=new ArrayList<>();
			List<String> sqlLists=new ArrayList<>();
			for (String key : aboutCPMap.keySet()) {
				 List<RowMap> lists=aboutCPMap.get(key);
				 RowMap data=lists.get(0);
				 String dj=data.getString("JG");//单价				
				 String BH=data.getString("BH");//物料编号
				 String lx=data.getString("TYPE");//物料类型
				 BigDecimal djnum=new BigDecimal(dj);				
				 String rgf=data.getString("RGF");//人工费
				 BigDecimal rgfnum=new BigDecimal(rgf);	
				 String isTrue="0"; 
				 for (RowMap rowMap : lists) {
					//获取装配件子项的物料明细
					String BM=rowMap.getString("BM");//编码
					String ID=rowMap.getString("ID");//子件材料ID	
					//获取对应更新的物料信息
					if(userMap.containsKey(BM)) {
						 isTrue="1";
						 String SL=rowMap.getString("NUMBER").isEmpty()?"0":rowMap.getString("NUMBER");//材料重量
						 BigDecimal sl=new BigDecimal(SL);	
						 String tp=rowMap.getString("TOTAL_PRICE");//人工费
						 BigDecimal tpOld=new BigDecimal(tp);
						 String GS=rowMap.getString("GS");//工时
						 BigDecimal gs=new BigDecimal(GS);
						 String JDL=rowMap.getString("JDL");//稼动率
						 BigDecimal jdl=new BigDecimal(JDL);
						 //获取对应的原材料单价
						 JSONObject json=userMap.get(BM);
						 String price=json.getString("PRICE");
						// 新的工时费=新的工时单价x时间x数量/稼动率/28800
						 BigDecimal priceNew=new BigDecimal(price);
						 BigDecimal num=new BigDecimal("28800");
						 BigDecimal num1=jdl.multiply(num);
						 BigDecimal tpNew=priceNew.multiply(sl).multiply(gs).divide(num1,4);
						 BigDecimal jjdj=priceNew.multiply(gs).divide(num1,4);
						 rgfnum=rgfnum.subtract(tpOld).add(tpNew);
						 //新的制造件的单价=原制造件单价-子件的原材料费+新子件材料单价x材料重量
						 djnum=djnum.subtract(tpOld).add(tpNew);						
						 //对该子件材料进行更新
						 //DBSql.update(zzjsql,new Object[] {priceNew,tpNew,jjdj,BM,ID});
						 String upSql= "update BO_EU_BO_EU_CPQ_COMPONENT_PART_USER_PRICE_GRID set PRICE= '"+priceNew+"',TOTAL_PRICE= '"+tpNew+"' ,JJDJ='"+jjdj+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
							//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
							sqlList.add(upSql);
					}
				 }
				// 更新物料信息数据。
					if (isTrue.equals("1")) {						
						 JSONObject json=new  JSONObject();
						 json.put("DJ",djnum );						 
						 json.put("RGF", rgfnum);
						 json.put("BM", BH);
						 if(lx.equals("装配件")) {
							 /**
							  * 装配件不能进行更新，需要到最后才能进行更新，原因是装配件中可能有多个装配件和多个制造件，子项中可能存在有多次更新的情况，
							  * 例如A中有B、C装配件，DF制造件。B中有F制造件。H中有A
							  * A为更新对象，D、F为更新对象，
							  * 其中第一次更新为A、D、F对象，
							  * 二次对制造件关联的装配体进行更新，更新对象为A、B、
							  * 
							  * 第三次对装配件关联的装配体进行更新、更新对象为H
							  */
							 json.put("CLF", data.getString("CLF"));
							 json.put("ZZFBL", data.getString("ZZFBL"));
							 json.put("BM", BH);
							 json.put("ZJS","");
							 comtMap.put(BH, json);
						 }else if (lx.equals("制造件")) {
							 WLMap.put(BH, json);
							// DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,
							
								
								String clf=data.getString("CLF");
								//String rgf=data.getString("RGF");
								String bl=data.getString("ZZFBL").isEmpty()?"0":data.getString("ZZFBL");
								//BigDecimal djnum = new BigDecimal(dj);
								BigDecimal clnum = new BigDecimal(clf);
								//BigDecimal rgnum = new BigDecimal(rgf);
								BigDecimal blnum = new BigDecimal(bl);
								BigDecimal num = new BigDecimal("100");
								BigDecimal num1 = new BigDecimal("1");
								BigDecimal zzf=	clnum.add(rgfnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));				 
							 
							 
							 //DBSql.update(wlsql,new Object[] {djnum,rgfnum,zzf,zzf.add(djnum),BH});

							 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+djnum+"',RGF= '"+rgfnum+"' ,ZZF='"+zzf+"',DJZZF='"+zzf.add(djnum)+"' where BM='"+BH+"'  ; ";
								//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
								sqlLists.add(upSql);
							 
							 
						}
						 
					}
			}
			if(sqlList.size()>0) {
				 String[] array3 = sqlList.toArray(new String[sqlList.size()]);	
				 DBSql.batch(array3);
			}
			String allCPsql = "select   a.BM,a.ID,a.SL,a.RGF,a.DJ,"
					+ "a.ZJ,"
					+ "a.ZGSF, "
					+ "b.BM as BH,b.DJ as JG,"
					+ "b.RGF as WRGF,b.CLF,b.ZZFBL "
					+ "from  BO_EU_CPQ_COMPONENT_PART_GRID a, BO_EU_CPQ_COMPONENT_PART b "
					+ "where  a.BINDID=b.BINDID and  b.TYPE='装配件' ";
			List<RowMap> allmaps = DBSql.getMaps(allCPsql);
			// 存放需要更新的装配件信息
			Map<String, List<RowMap>> aboutZPMap = new HashMap<>();
			if (allmaps.size() > 0) {
				for (RowMap rowMap : allmaps) {
					String bh = rowMap.getString("BH");
					if (aboutZPMap.containsKey(bh)) {
						List<RowMap> lists = aboutZPMap.get(bh);
						lists.add(rowMap);
						aboutZPMap.put(bh, lists);
					} else {
						List<RowMap> lists = new ArrayList<RowMap>();
						lists.add(rowMap);
						aboutZPMap.put(bh, lists);
					}

				}
			}
			/**
			 * + "ZJ=?,ZLSJ=?,ZBGLSJ=?,ZJGLSJ=?,ZRGLSJ=?,ZQTJN=?,ZQTJGT=?,ZRKJ=?,"
			     		+ "ZCLF=?,ZLSJCLF=?,ZBGLSJCLF=?,ZRGLSJCLF=?,ZJGLSJCLF=?,ZQTNCLF=?,ZQTTCLF=?,ZRKJCLF=? "
			 */
		     String sql = "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ=?,"
		     		+ "RGF=?,"
		     		+ "ZJ=?,"
		     		+ "ZGSF=? where BM=? and ID=?";

			//2、对所涉及更新后的制造件的装配件进行更新，其中更新的装配件和第一次更新的装配件一样，则取更新后存放在装配件map的装配件
		     List<String> wlList=new ArrayList<>();
			 	for (String key : aboutZPMap.keySet()) {
			 		List<RowMap> lists=aboutZPMap.get(key);
					 RowMap data=lists.get(0);
					 String dj=data.getString("JG");//装配件单价					
					 String BH=data.getString("BH");//装配件编号
					 BigDecimal djnum=new BigDecimal(dj);					
					 String rgf=data.getString("WRGF");//装配件材料费
					 BigDecimal rgfnum=new BigDecimal(rgf);	
					 String isTrue="0"; 
					 for (RowMap rowMap : lists) {
						//获取装配件子项的物料明细
						String BM=rowMap.getString("BM");//编码
						String ID=rowMap.getString("ID");//子件材料ID								
						//获取对应更新的物料信息,判断是否存在更新的物料信息
						if(WLMap.containsKey(BM)) {
							 isTrue="1";
							 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//数量
							 BigDecimal sl=new BigDecimal(SL);	
							 String ZGSF=rowMap.getString("ZGSF");//总工时费
							 BigDecimal zgsfOld=new BigDecimal(ZGSF);
							 String ZJ=rowMap.getString("ZJ");//总价							 
							 BigDecimal zjOld=new BigDecimal(ZJ);							 
							 //获取对应的原材料单价
							 JSONObject json=WLMap.get(BM);
							 String cldj=json.getString("DJ");							 							 
							 BigDecimal cldjNew=new BigDecimal(cldj);							 
							 String RGF=json.getString("RGF");
							 BigDecimal refNew=new BigDecimal(RGF);
							// 新的装配件的材料费=原装配件材料费-子件的原材料费总价+新子件材料费x数量									
							 BigDecimal  zgsfNew=refNew.multiply(sl);
							 rgfnum=rgfnum.subtract(zgsfOld).add(zgsfNew);
							 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
							 BigDecimal  zjNew=cldjNew.multiply(sl);							
							 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));							 
							 //对该子件材料进行更新
							 /**
							  * DBSql.update(sql,new Object[] {cldjNew,
							  *  refNew,
									 zjNew,
									 zgsfNew,BM,ID});
							  */
									

								 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',RGF= '"+refNew+"' ,ZJ='"+zjNew+"',ZGSF='"+zgsfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
									//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
									wlList.add(upSql);
						}
				 }
				// 更新装配件数据。
					if (isTrue.equals("1")) {
						//,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,"
						 //DBSql.update(wlsql,new Object[] {djnum,rgfnum,BH});
						 String clf=data.getString("CLF");
							//String rgf=data.getString("RGF");
							String bl=data.getString("ZZFBL").isEmpty()?"0":data.getString("ZZFBL");
							//BigDecimal djnum = new BigDecimal(dj);
							BigDecimal clnum = new BigDecimal(clf);
							//BigDecimal rgnum = new BigDecimal(rgf);
							BigDecimal blnum = new BigDecimal(bl);
							BigDecimal num = new BigDecimal("100");
							BigDecimal num1 = new BigDecimal("1");
							BigDecimal zzf=	clnum.add(rgfnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));				 
						 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+djnum+"',RGF= '"+rgfnum+"' ,ZZF='"+zzf+"',DJZZF='"+zzf.add(djnum)+"' where BM='"+BH+"'  ; ";
							//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
							sqlLists.add(upSql);
						 JSONObject json=new  JSONObject();
						 json.put("DJ",djnum );						
						 json.put("RGF", rgfnum);
						 json.put("CLF", data.getString("CLF"));
						 json.put("ZZFBL", data.getString("ZZFBL"));
						 json.put("BM", BH);						
						 json.put("ZJS","");
						 comtMap.put(BH, json);
					}
					 
		
			 	}
			/**
			 * 循环遍历新的装配件，如果遍历的装配件中存在与第一次更新的装配件一样，则去第一次的装配件数据进行更新，并存放到新的装配件map中。
			 * 直到装配件map的数据没有新增后，跳出循环，并更新装配件的数据。
			 * 
			 */
			 	Boolean is = true;
			 	List<String> list=new ArrayList<>();
				while (is) {
					int i=list.size();
					for (String key : aboutZPMap.keySet()) {
				 		List<RowMap> lists=aboutZPMap.get(key);
				 		 RowMap data=lists.get(0);
				 		String rgf=data.getString("WRGF");//装配件材料费
						 String dj=data.getString("JG");//装配件单价						 
						 String bhs="";
				 		//判断在已更新装配件map中是否存在
				 		if(comtMap.containsKey(key)) {
				 			JSONObject json=comtMap.get(key);
				 			rgf=json.getString("RGF");
				 			dj=json.getString("DJ");
				 			bhs=json.getString("ZJS");
				 		}						
						 String BH=data.getString("BH");//装配件编号
						 BigDecimal djnum=new BigDecimal(dj);						
						 BigDecimal rgfnum=new BigDecimal(rgf);	
						 String isTrue="0"; 
						 for (RowMap rowMap : lists) {
							//获取装配件子项的物料明细
							String BM=rowMap.getString("BM");//编码
							String ID=rowMap.getString("ID");//子件材料ID								
							//获取对应更新的物料信息,判断是否存在更新的物料信息
							if(comtMap.containsKey(BM)) {
								/*
								 * 判断是之前更新过的装配件，如果是则判断该子项是否已经更新过，
								 * 如果更新过则不进行计算，如果没有则进行更新，并将更新后的数据进行记录，存放到map里面。
								 */
								
								if(comtMap.containsKey(key)) {	
									JSONObject json1=comtMap.get(key);
									 //bhs=json1.getString("ZJS");
									if(bhs.isEmpty()||bhs.indexOf(BM)<0) {
										isTrue="1";
										 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
										 BigDecimal sl=new BigDecimal(SL);	
										 String ZGSF=rowMap.getString("ZGSF").isEmpty()?"0":rowMap.getString("ZGSF");//总工时费
										 BigDecimal zgsfOld=new BigDecimal(ZGSF);
										 String ZJ=rowMap.getString("ZJ");//总价										
										 BigDecimal zjOld=new BigDecimal(ZJ);										 
										 //获取对应的原材料单价
										 JSONObject json=comtMap.get(BM);
										 String cldj=json.getString("DJ");										 
										 BigDecimal cldjNew=new BigDecimal(cldj);										
										 String RGF=json.getString("RGF");
										 BigDecimal refNew=new BigDecimal(RGF);
										// 新的装配件的材料费=原装配件工时费-子件的原材料费总价+新子件材料费x数量									
										 BigDecimal  zgsfNew=refNew.multiply(sl);
										 
										 rgfnum=rgfnum.subtract(zgsfOld).add(zgsfNew);
										 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
										 BigDecimal  zjNew=cldjNew.multiply(sl);										 
										 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));										
										 //对该子件材料进行更新
										 //DBSql.update(sql,new Object[] {cldjNew,refNew,zjNew,zgsfNew,BM,ID});

										 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',RGF= '"+refNew+"' ,ZJ='"+zjNew+"',ZGSF='"+zgsfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
											//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
											wlList.add(upSql);
									     //将子项的编号存放在bhs中
										if(bhs.isEmpty()) {
											bhs=BM;
										}else {
											bhs=bhs+","+BM;
										}
									}
								}else {
									isTrue="1";
									 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
									 BigDecimal sl=new BigDecimal(SL);	
									 String ZGSF=rowMap.getString("ZGSF").isEmpty()?"0":rowMap.getString("ZGSF");//总材料费
									 BigDecimal zgsfOld=new BigDecimal(ZGSF);
									 String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价									
									 BigDecimal zjOld=new BigDecimal(ZJ);									
									 //获取对应的原材料单价
									 JSONObject json=comtMap.get(BM);
									 String cldj=json.getString("DJ");									 
									 BigDecimal cldjNew=new BigDecimal(cldj);									 
									 String RGF=json.getString("RGF");
									 BigDecimal refNew=new BigDecimal(RGF);
									// 新的装配件的材料费=原装配件材料费-子件的原材料费总价+新子件材料费x数量									
									 BigDecimal  zgsfNew=refNew.multiply(sl);
									 rgfnum=rgfnum.subtract(zgsfOld).add(zgsfNew);
									 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
									 BigDecimal  zjNew=cldjNew.multiply(sl);									 
									 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));									
									 //对该子件材料进行更新
									 //DBSql.update(sql,new Object[] {cldjNew,refNew,zjNew,zgsfNew,BM,ID});
									 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',RGF= '"+refNew+"' ,ZJ='"+zjNew+"',ZGSF='"+zgsfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
										//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
										wlList.add(upSql);
								     //将子项的编号存放在bhs中
									 if(bhs.isEmpty()) {
											bhs=BM;
										}else {
											bhs=bhs+","+BM;
										}
								}
								 
							}
					 }
					// 更新装配件数据。
						if (isTrue.equals("1")) {
							   i++;
							 //DBSql.update(zzjsql,new Object[] {djnum,rgfnum,BH});
							 JSONObject json=new  JSONObject();
							 json.put("DJ",djnum );							 
							 json.put("RGF", rgfnum);
							 json.put("CLF", data.getString("CLF"));
							 json.put("ZZFBL", data.getString("ZZFBL"));
							 json.put("BM", BH);
							 json.put("ZJS", bhs);
							 comtMap.put(BH, json);
							 list.add(BH);
						}
						 
			
				 	}
					// 如果获取的装配件的数量大于之前的数量，说明有有新增更新的装配件数据，如果没有则已经更新完毕,跳出循环。
					if (list.size()==i) {
						is = false;
					} 

				}
				if(wlList.size()>0) {
					String[] array = wlList.toArray(new String[wlList.size()]);					
					DBSql.batch(array);  
				}	
				//将获取到的装配件进行更新
				if(comtMap.size()>0) {
					for (String key : comtMap.keySet()) {
						JSONObject json=comtMap.get(key);
						// DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,"
						String dj=json.getString("DJ");
						String clf=json.getString("CLF");
						String rgf=json.getString("RGF");
						String bl=json.getString("ZZFBL").isEmpty()?"0":json.getString("ZZFBL");
						BigDecimal djnum = new BigDecimal(dj);
						BigDecimal clnum = new BigDecimal(clf);
						BigDecimal rgnum = new BigDecimal(rgf);
						BigDecimal blnum = new BigDecimal(bl);
						BigDecimal num = new BigDecimal("100");
						BigDecimal num1 = new BigDecimal("1");
						BigDecimal zzf=	clnum.add(rgnum).divide(num1.subtract(blnum.divide(num)), 4).multiply(blnum.divide(num));				
						//System.out.println("更新的装配件信息："+json);										
						//DBSql.update(wlsql,new Object[] {json.getString("DJ"),json.getString("RGF"),zzf,zzf.add(djnum),json.getString("BM")});
						 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+json.getString("DJ")+"',RGF= '"+json.getString("RGF")+"' ,ZZF='"+zzf+"',DJZZF='"+zzf.add(djnum)+"' where BM='"+json.getString("BM")+"'  ; ";
							//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
							sqlLists.add(upSql);
					}
				}
				if(sqlLists.size()>0) {
					String[] array2 = sqlLists.toArray(new String[sqlLists.size()]);					
					DBSql.batch(array2);  
				}	
				//将更新的物料信息存放在comtmap中
				if(WLMap.size()>0) {
					for (String  key : WLMap.keySet()) {
						comtMap.put(key, WLMap.get(key));
					}
				}
				
				return comtMap;
		} catch (Exception e) {
			throw e;
		}
	}
	/**
	 * 对外协单价进行更新后，物料中的制造件和装配件进行更新
	 * @param userMap
	 * @return
	 */
	public static Map<String, JSONObject> outsourcingRefreshAssembly‌(Map<String, JSONObject> userMap){
		
		try {
			//查询所涉及的制造件和装配件

			String mpSql="select   a.ID,a.BM,a.PRICE,a.TOTAL_PRICE,a.NUMBER,"
					+ "b.BM as BH,b.TYPE,b.DJ as JG,"
					+ "b.WXWG  "
					+ "from  BO_EU_CPQ_COMPONENT_PART_OUTSOURCING_GRID a, BO_EU_CPQ_COMPONENT_PART b "
					+ "where  a.BINDID=b.BINDID and  b.TYPE in('制造件','装配件') ";
			List<RowMap> mpMaps=DBSql.getMaps(mpSql);
			//1、将所涉及的装配件和制造件进行价格更新，更新后将制造件数据和装配件数据分别存放在map中。
			Map<String, List<RowMap>> aboutCPMap = new HashMap<>();
			if (mpMaps.size() > 0) {
				for (RowMap rowMap : mpMaps) {
					String bh = rowMap.getString("BH");
					if (aboutCPMap.containsKey(bh)) {
						List<RowMap> lists = aboutCPMap.get(bh);
						lists.add(rowMap);
						aboutCPMap.put(bh, lists);
					} else {
						List<RowMap> lists = new ArrayList<RowMap>();
						lists.add(rowMap);
						aboutCPMap.put(bh, lists);
					}

				}
			}
			  String zzjsql = "update BO_EU_CPQ_COMPONENT_PART_OUTSOURCING_GRID set PRICE=?,TOTAL_PRICE=? where BM=? and ID=?";
			  String wlsql = "update BO_EU_CPQ_COMPONENT_PART set DJ=?,"
			  		+ "WXWG=? where BM=? ";
			 Map<String, JSONObject> comtMap = new HashMap<String, JSONObject>();
		Map<String, JSONObject> WLMap = new HashMap<>();
		List<String> sqlList=new ArrayList<>();
		List<String> sqlLists=new ArrayList<>();
		for (String key : aboutCPMap.keySet()) {
			 List<RowMap> lists=aboutCPMap.get(key);
			 RowMap data=lists.get(0);
			 String dj=data.getString("JG");//单价
			 String BH=data.getString("BH");//物料编号
			 String lx=data.getString("TYPE");//物料类型
			 BigDecimal djnum=new BigDecimal(dj);			
			 String wxf=data.getString("WXWG");//外协费
			 BigDecimal wxfnum=new BigDecimal(wxf);	
			 String isTrue="0"; 
			 for (RowMap rowMap : lists) {
				//获取装配件子项的物料明细
				String BM=rowMap.getString("BM");//编码
				String ID=rowMap.getString("ID");//子件材料ID	
				//获取对应更新的物料信息
				if(userMap.containsKey(BM)) {
					 isTrue="1";
					 String SL=rowMap.getString("NUMBER").isEmpty()?"0":rowMap.getString("NUMBER");//材料重量
					 BigDecimal sl=new BigDecimal(SL);	
					 String tp=rowMap.getString("TOTAL_PRICE");//外协费
					 BigDecimal tpOld=new BigDecimal(tp);
					 //获取对应的原材料单价
					 JSONObject json=userMap.get(BM);
					 String price=json.getString("QTFY");
					// 新的工时费=新的工时单价x时间x数量/稼动率/28800
					 BigDecimal priceNew=new BigDecimal(price);
					 BigDecimal tpNew=priceNew.multiply(sl);
					 wxfnum=wxfnum.subtract(tpOld).add(tpNew);
					 //新的制造件的单价=原制造件单价-子件的原材料费+新子件材料单价x材料重量
					 djnum=djnum.subtract(tpOld).add(tpNew);					
					 //对该子件材料进行更新
					 //DBSql.update(zzjsql,new Object[] {priceNew,tpNew,BM,ID});
					 
					 String upSql= "update BO_EU_CPQ_COMPONENT_PART_OUTSOURCING_GRID set PRICE= '"+priceNew+"',TOTAL_PRICE= '"+tpNew+"'  where BM='"+BM+"' and ID='"+ID+"'; ";
						//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
						sqlLists.add(upSql);
				}
			 }
			// 更新物料信息数据。
				if (isTrue.equals("1")) {						
					 JSONObject json=new  JSONObject();
					 json.put("DJ",djnum );					
					 json.put("WXWG", wxfnum);
					 json.put("BM", BH);
					 if(lx.equals("装配件")) {
						 /**
						  * 装配件不能进行更新，需要到最后才能进行更新，原因是装配件中可能有多个装配件和多个制造件，子项中可能存在有多次更新的情况，
						  * 例如A中有B、C装配件，DF制造件。B中有F制造件。H中有A
						  * A为更新对象，D、F为更新对象，
						  * 其中第一次更新为A、D、F对象，
						  * 二次对制造件关联的装配体进行更新，更新对象为A、B、
						  * 
						  * 第三次对装配件关联的装配体进行更新、更新对象为H
						  */
						
						 json.put("ZJS","");
						 comtMap.put(BH, json);
					 }else if (lx.equals("制造件")) {
						 WLMap.put(BH, json);
						// "update BO_EU_CPQ_COMPONENT_PART set DJ=?, DJ=?,LSJ=?,BGLSJ=?,RGLSJ=?,JGLSJ=?,QTJN=?,QTJGT=?,RLJ=?,"
					  	//	+ "WXWG=? where BM=? ";
						 //DBSql.update(wlsql,new Object[] {djnum,wxfnum,BH});
						 
						 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+djnum+"',WXWG= '"+wxfnum+"'  where BM='"+BH+"' ; ";
							//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
							sqlList.add(upSql);
					}
					 
				}
		}	
		if(sqlLists.size()>0) {
			 String[] array2 = sqlLists.toArray(new String[sqlLists.size()]);
				DBSql.batch(array2);
		}
 
		String allCPsql = "select   a.BM,a.ID,a.SL,a.WXWG,"
				+ "a.DJ,"
				+ "a.ZJ,"
				+ "a.ZWX,"
				+ "b.BM as BH,b.DJ as JG,"
				+ "b.WXWG as WX "
				+ "from  BO_EU_CPQ_COMPONENT_PART_GRID a, BO_EU_CPQ_COMPONENT_PART b "
				+ "where  a.BINDID=b.BINDID and  b.TYPE='装配件' ";
		List<RowMap> allmaps = DBSql.getMaps(allCPsql);
		// 存放需要更新的装配件信息
		Map<String, List<RowMap>> aboutZPMap = new HashMap<>();
		if (allmaps.size() > 0) {
			for (RowMap rowMap : allmaps) {
				String bh = rowMap.getString("BH");
				if (aboutZPMap.containsKey(bh)) {
					List<RowMap> lists = aboutZPMap.get(bh);
					lists.add(rowMap);
					aboutZPMap.put(bh, lists);
				} else {
					List<RowMap> lists = new ArrayList<RowMap>();
					lists.add(rowMap);
					aboutZPMap.put(bh, lists);
				}

			}
		}
		
	     String sql = "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ=?,"
	     		+ "WXWG=?,"
	     		+ "ZJ=?,"
	     		+ "ZWX=? where BM=? and ID=?";
	   //2、对所涉及更新后的制造件的装配件进行更新，其中更新的装配件和第一次更新的装配件一样，则取更新后存放在装配件map的装配件
	     List<String> wlLists=new ArrayList<>();
		 	for (String key : aboutZPMap.keySet()) {
		 		List<RowMap> lists=aboutZPMap.get(key);
				 RowMap data=lists.get(0);
				 String dj=data.getString("JG");//装配件单价
				 String BH=data.getString("BH");//装配件编号
				 BigDecimal djnum=new BigDecimal(dj);
				 String wxf=data.getString("WX");//装配件外协费
				 BigDecimal wxfnum=new BigDecimal(wxf);	
				 String isTrue="0"; 
				 for (RowMap rowMap : lists) {
					//获取装配件子项的物料明细
					String BM=rowMap.getString("BM");//编码
					String ID=rowMap.getString("ID");//子件材料ID								
					//获取对应更新的物料信息,判断是否存在更新的物料信息
					if(WLMap.containsKey(BM)) {
						 isTrue="1";
						 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
						 BigDecimal sl=new BigDecimal(SL);	
						 String ZWX=rowMap.getString("ZWX");//总外协
						 BigDecimal zwxfOld=new BigDecimal(ZWX);
						 String ZJ=rowMap.getString("ZJ");//总价
						 BigDecimal zjOld=new BigDecimal(ZJ);						
						 //获取对应的原材料单价
						 JSONObject json=WLMap.get(BM);
						 String cldj=json.getString("DJ");						
						 BigDecimal cldjNew=new BigDecimal(cldj);						
						 String WXWG=json.getString("WXWG");
						 BigDecimal wxfNew=new BigDecimal(WXWG);
						// 新的装配件的材料费=原装配件材料费-子件的原材料费总价+新子件材料费x数量									
						 BigDecimal  zwxfNew=wxfNew.multiply(sl);
						 wxfnum=wxfnum.subtract(zwxfOld).add(zwxfNew);
						 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
						 BigDecimal  zjNew=cldjNew.multiply(sl);
						
						 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));
						
						 //对该子件材料进行更新
						/**
						 *  DBSql.update(sql,new Object[] {cldjNew,
						 *   wxfNew,
								 zjNew,
								 zwxfNew,BM,ID});
						 */
								
							 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',WXWG= '"+wxfNew+"' ,ZJ='"+zjNew+"',ZWX='"+zwxfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
								//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
								wlLists.add(upSql);
					}
			 }
			// 更新装配件数据。
				if (isTrue.equals("1")) {
					 //DBSql.update(wlsql,new Object[] {djnum,wxfnum,BH});
					 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+djnum+"',WXWG= '"+wxfnum+"'  where BM='"+BH+"' ; ";
						//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
						sqlList.add(upSql);
					 JSONObject json=new  JSONObject();
					 json.put("DJ",djnum );					 
					 json.put("WXWG", wxfnum);
					 json.put("BM", BH);						
					 json.put("ZJS","");
					 comtMap.put(BH, json);
				}
				 

		 	}
		 	/**
			 * 循环遍历新的装配件，如果遍历的装配件中存在与第一次更新的装配件一样，则去第一次的装配件数据进行更新，并存放到新的装配件map中。
			 * 直到装配件map的数据没有新增后，跳出循环，并更新装配件的数据。
			 * 
			 */
		 	Boolean is = true;
		 	List<String> list=new ArrayList<>();
			while (is) {
				int i=list.size();
				for (String key : aboutZPMap.keySet()) {
			 		List<RowMap> lists=aboutZPMap.get(key);
			 		 RowMap data=lists.get(0);			 		
			 		String wxf=data.getString("WX");//装配件外协费
					 String dj=data.getString("JG");//装配件单价					
					 String bhs="";
			 		//判断在已更新装配件map中是否存在
			 		if(comtMap.containsKey(key)) {
			 			JSONObject json=comtMap.get(key);
			 			System.out.print("json:"+json.toString());
			 			wxf=json.getString("WXWG");
			 			dj=json.getString("DJ");			 			
			 			bhs=json.getString("ZJS");
			 		}						
					 String BH=data.getString("BH");//装配件编号
					 BigDecimal djnum=new BigDecimal(dj);					 
					 BigDecimal wxfnum=new BigDecimal(wxf);	
					 String isTrue="0"; 
					 for (RowMap rowMap : lists) {
						//获取装配件子项的物料明细
						String BM=rowMap.getString("BM");//编码
						String ID=rowMap.getString("ID");//子件材料ID		
						
						//获取对应更新的物料信息,判断是否存在更新的物料信息
						if(comtMap.containsKey(BM)) {
							/*
							 * 判断是之前更新过的装配件，如果是则判断该子项是否已经更新过，
							 * 如果更新过则不进行计算，如果没有则进行更新，并将更新后的数据进行记录，存放到map里面。
							 */
							
							if(comtMap.containsKey(key)) {	
								JSONObject json1=comtMap.get(key);
								/// bhs=json1.getString("ZJS");
								if(bhs.isEmpty()||bhs.indexOf(BM)<0) {
									isTrue="1";
									 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料重量
									 BigDecimal sl=new BigDecimal(SL);	
									 String ZWX=rowMap.getString("ZWX").isEmpty()?"0":rowMap.getString("ZWX");//总工时费
									 BigDecimal zwxfOld=new BigDecimal(ZWX);
									 String ZJ=rowMap.getString("ZJ");//总价
									 
									 BigDecimal zjOld=new BigDecimal(ZJ);
									 
									 //获取对应的物料单价
									 JSONObject json=comtMap.get(BM);
									 String cldj=json.getString("DJ");
									 
									 BigDecimal cldjNew=new BigDecimal(cldj);
									 
									 String WXWG=json.getString("WXWG");
									 BigDecimal wxfNew=new BigDecimal(WXWG);
									// 新的装配件的外协费=原装配件外协费-子件的原外协费的总价+新子件外协费x数量									
									 BigDecimal  zwxfNew=wxfNew.multiply(sl);
									 wxfnum=wxfnum.subtract(zwxfOld).add(zwxfNew);
									 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
									 BigDecimal  zjNew=cldjNew.multiply(sl);
									
									 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));
									 
									 //对该子件材料进行更新
									/**
									 *  DBSql.update(sql,new Object[] {cldjNew,
									 *  wxfNew,
											 zjNew,
											 zwxfNew,BM,ID});
									 */
											 
									 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',WXWG= '"+wxfNew+"' ,ZJ='"+zjNew+"',ZWX='"+zwxfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
										//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
										wlLists.add(upSql);
								     //将子项的编号存放在bhs中
									if(bhs.isEmpty()) {
										bhs=BM;
									}else {
										bhs=bhs+","+BM;
									}
								}
							}else {
								isTrue="1";
								 String SL=rowMap.getString("SL").isEmpty()?"0":rowMap.getString("SL");//材料数量
								 BigDecimal sl=new BigDecimal(SL);	
								 String ZWX=rowMap.getString("ZWX").isEmpty()?"0":rowMap.getString("ZWX");//总外协费
								 BigDecimal zwxfOld=new BigDecimal(ZWX);
								 String ZJ=rowMap.getString("ZJ").isEmpty()?"0":rowMap.getString("ZJ");//总价
								 
								 BigDecimal zjOld=new BigDecimal(ZJ);
								 
								 //获取对应的原材料单价
								 JSONObject json=comtMap.get(BM);
								 String cldj=json.getString("DJ");
								 
								 BigDecimal cldjNew=new BigDecimal(cldj);
								 
								 String WXWG=json.getString("WXWG");
								 BigDecimal wxfNew=new BigDecimal(WXWG);
								// 新的装配件的外协费=原装配件外协费-子件的原外协费总价+新子件外协费x数量									
								 BigDecimal  zwxfNew=wxfNew.multiply(sl);
								 
								 wxfnum=wxfnum.subtract(zwxfOld).add(zwxfNew);
								 //新的装配件的单价=原装配件单价-子件的总价+新子件单价x数量
								 BigDecimal  zjNew=cldjNew.multiply(sl);
								
								 djnum=djnum.subtract(zjOld).add(cldjNew.multiply(sl));
								 
								 //对该子件材料进行更新
								/**
								 *  DBSql.update(sql,new Object[] {cldjNew,
								 *   wxfNew,
										 zjNew,
										 zwxfNew,BM,ID});
								 */
										
								 String upSql= "update BO_EU_CPQ_COMPONENT_PART_GRID set DJ= '"+cldjNew+"',WXWG= '"+wxfNew+"' ,ZJ='"+zjNew+"',ZWX='"+zwxfNew+"' where BM='"+BM+"' and ID='"+ID+"' ; ";
									//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
									wlLists.add(upSql);
							     //将子项的编号存放在bhs中
									if(bhs.isEmpty()) {
										bhs=BM;
									}else {
										bhs=bhs+","+BM;
									}
							}
							 
						}
				 }
				// 更新装配件数据。
					if (isTrue.equals("1")) {
						   i++;
						 //DBSql.update(zzjsql,new Object[] {djnum,rgfnum,BH});
						 JSONObject json=new  JSONObject();
						 json.put("DJ",djnum );
						 
						 json.put("WXWG", wxfnum);
						 json.put("BM", BH);
						 json.put("ZJS", bhs);
						 comtMap.put(BH, json);
						 list.add(BH);
					}
					 
		
			 	}
				// 如果获取的装配件的数量大于之前的数量，说明有有新增更新的装配件数据，如果没有则已经更新完毕,跳出循环。
				if (list.size()==i) {
					is = false;
				} 

			}
			if(wlLists.size()>0) {
				String[] array = wlLists.toArray(new String[wlLists.size()]);			 			
				DBSql.batch(array);
			}

			//将获取到的装配件进行更新
			if(comtMap.size()>0) {
				for (String key : comtMap.keySet()) {
					JSONObject json=comtMap.get(key);
					//DBSql.update(wlsql,new Object[] {json.getString("DJ"),json.getString("WXWG"),json.getString("BM")});
					 String upSql= "update BO_EU_CPQ_COMPONENT_PART set DJ= '"+json.getString("DJ")+"',WXWG= '"+json.getString("WXWG")+"'  where BM='"+json.getString("BM")+"' ; ";
						//upSql=String.format(upSql, cldjNew,clfNew,zjNew,zclfNew,ID);
						sqlList.add(upSql);
				}
			}
			if(sqlList.size()>0) {
				 String[] array3 = sqlList.toArray(new String[sqlList.size()]);			 			 
					DBSql.batch(array3);
			}
			
			//将更新的物料信息存放在comtmap中
			if(WLMap.size()>0) {
				for (String  key : WLMap.keySet()) {
					comtMap.put(key, WLMap.get(key));
				}
			}
			return comtMap;
		} catch (Exception e) {
			throw e;
		}
		
	}
}
